#include "myvector.h"
#include <stdlib.h>
#include <string.h>
#include <assert.h>

// 动态数组内部结构
struct MyVector
{
    void *data;       // 存储元素的连续内存块
    size_t item_size; // 每个元素的大小（字节）
    size_t size;      // 当前元素数量
    size_t capacity;  // 当前容量（总空间）
};

// 初始容量（第一次 push_back 时分配）
#define INITIAL_CAPACITY 4

MyVector *myvector_create(size_t item_size)
{
    MyVector *vec = (MyVector *)malloc(sizeof(MyVector));
    if (!vec)
        return NULL;

    vec->item_size = item_size;
    vec->size = 0;
    vec->capacity = 0;
    vec->data = NULL;

    return vec;
}

void myvector_destroy(MyVector *vec)
{
    if (vec)
    {
        free(vec->data); // 先释放元素内存
        free(vec);       // 再释放结构体
    }
}

void myvector_push_back(MyVector *vec, const void *element)
{
    assert(vec && element);

    // 容量不足时扩容（策略：翻倍）
    if (vec->size >= vec->capacity)
    {
        size_t new_capacity = vec->capacity == 0 ? INITIAL_CAPACITY : vec->capacity * 2;
        void *new_data = realloc(vec->data, new_capacity * vec->item_size);
        if (!new_data)
        {
            perror("myvector_push_back: realloc failed");
            return;
        }
        vec->data = new_data;
        vec->capacity = new_capacity;
    }

    // 拷贝元素到末尾
    void *dest = (char *)vec->data + vec->size * vec->item_size;
    memcpy(dest, element, vec->item_size);
    vec->size++;
}

size_t myvector_size(const MyVector *vec)
{
    return vec ? vec->size : 0;
}

const void *myvector_get(const MyVector *vec, size_t index)
{
    assert(vec && index < vec->size);
    return (const char *)vec->data + index * vec->item_size;
}

void *myvector_at(MyVector *vec, size_t index)
{
    assert(vec && index < vec->size);
    return (char *)vec->data + index * vec->item_size;
}

void myvector_sort(MyVector *vec, int (*compare)(const void *, const void *))
{
    assert(vec && compare);
    qsort(vec->data, vec->size, vec->item_size, compare);
}